﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Burraco.Library;
using System.Threading;

namespace Burraco.WinApp
{
    public partial class FormStart : Form
    {
        private Thread trdGenera;

        public FormStart()
        {
            InitializeComponent();
        }

        private ModalitaSesso getModalitaSessoFromCombo()
        {
            switch (cmbModalitaSesso.SelectedIndex)
            {
                case 0: return ModalitaSesso.TuttiControTutti;
                case 1: return ModalitaSesso.MaschiVsFemmine;
                case 2: return ModalitaSesso.MaschioConFemmina;
                case 3: return ModalitaSesso.SessoUnico;
                default: return ModalitaSesso.TuttiControTutti;
            }
        }

        private ModalitaCompagni getModalitaCompagniFromCombo()
        {
            switch (cmbModalitaCompagni.SelectedIndex)
            {
                case 0: return ModalitaCompagni.Mai;
                case 1: return ModalitaCompagni.SiAvversarioNoCoppia;
                case 2: return ModalitaCompagni.SiCoppiaNoAvversario;
                case 3: return ModalitaCompagni.Sempre;
                case 4: return ModalitaCompagni.CoppieFisse;
                default: return ModalitaCompagni.Mai;
            }
        }

        private void btnGeneraTorneo_Click(object sender, EventArgs e)
        {
            Torneo t = new Torneo();

            t.onTorneoGenerato += new Torneo.TorneoGeneratoEventHandler(torneo_generato);
            t.onRicomincia += new Torneo.RicominciaEventHandler(t_onRicomincia);
            t.onPartitaCreata += new Torneo.PartitaCreataEventHandler(t_onPartitaCreata);
            t.onCoppiaNonValida += new Torneo.CoppiaNonValidaEventHandler(t_onCoppiaNonValida);
            t.onTavoloDa2NonValido += new Torneo.TavoloDa2NonValidoEventHandler(t_onTavoloNonValido);
            t.onTavoloDa3NonValido += new Torneo.TavoloDa3NonValidoEventHandler(t_onTavoloNonValido);
            t.onTavoloDa4NonValido += new Torneo.TavoloDa4NonValidoEventHandler(t_onTavoloNonValido);
            t.onTentativoFallito += new Torneo.TentativoFallitoEventHandler(t_onTentativoFallito);


            t.creaGiocatoriTest(Convert.ToInt32(numPartecipanti.Value));
            t.RegolaSesso = getModalitaSessoFromCombo();
            t.RegolaCompagni = getModalitaCompagniFromCombo();
            t.LimiteRipetiCoppia = Convert.ToInt32(numLimiteCoppia.Value);
            t.LimiteRipetiAvversario = Convert.ToInt32(numLimiteAvversari.Value);
            t.LimiteRipetiTavolo = Convert.ToInt32(numLimiteTavolo.Value);
            t.LimiteRipetiInTavoloZoppo = Convert.ToInt32(numLimiteTavoloZoppo.Value);
            t.LimiteRipetiInTavoloZoppoDa2 = Convert.ToInt32(numLimiteTavoloZoppoDa2.Value);
            t.LimiteRipetiInTavoloZoppoDa3 = Convert.ToInt32(numLimiteTavoloZoppoDa3.Value);
            t.NumeroPartite = Convert.ToInt32(numPartite.Value);

            trdGenera = new System.Threading.Thread(t.GeneraTorneo);
            trdGenera.Start();

            //t.GeneraTorneo();
            //FormGriglia frmGrid = new FormGriglia() { Torneo = t };
            //frmGrid.FillGriglia();
            //frmGrid.Show();

            intTavoliNonValidi = 0;
            intTentativiCoppie = 0;
            intTentativiTavoli = 0;
            intCoppieNonValide = 0;
            intPartiteCreate = 0;
            intRipartenze = 0;

            SetTextboxText(txtCoppieTentativi, intTentativiCoppie.ToString());
            SetTextboxText(txtTavoliNonValidi, intTavoliNonValidi.ToString());
            SetTextboxText(txtCoppieNonValide, intCoppieNonValide.ToString());
            SetTextboxText(txtTavoliTentativi, intTentativiTavoli.ToString());
            SetTextboxText(txtRipartenze, intRipartenze.ToString());
            SetTextboxText(txtPartiteCreate, intPartiteCreate.ToString());
        }

        private int intTavoliNonValidi = 0;
        void t_onTavoloNonValido(Partita sender, EventArgs eventargs)
        {
            intTavoliNonValidi++;
            SetTextboxText(txtTavoliNonValidi, intTavoliNonValidi.ToString());
        }

        private int intTentativiCoppie = 0;
        private int intTentativiTavoli = 0;
        void t_onTentativoFallito(Partita sender, TentativoFallitoEventArgs eventargs)
        {
            if (eventargs.GetType() == typeof(TentativoCoppiaFallitoEventArgs))
            {
                intTentativiCoppie++;
                SetTextboxText(txtCoppieTentativi, intTentativiCoppie.ToString());
            }

            if (eventargs.GetType() == typeof(TentativoTavoloFallitoEventArgs))
            {
                intTentativiTavoli++;
                SetTextboxText(txtTavoliTentativi, intTentativiTavoli.ToString());
            }
        }

        private int intCoppieNonValide = 0;
        void t_onCoppiaNonValida(Partita sender, CoppiaNonValidaEventArgs eventargs)
        {
            intCoppieNonValide++;
            SetTextboxText(txtCoppieNonValide, intCoppieNonValide.ToString());
        }

        int intPartiteCreate = 0;
        void t_onPartitaCreata(Torneo sender, PartitaCreataEventArgs e)
        {
            SetTextboxText(txtPartiteCreate, e.NumeroPartiteCreate.ToString());
        }

        private int intRipartenze = 0;
        void t_onRicomincia(Torneo sender, EventArgs e)
        {
            intRipartenze++;
            SetTextboxText(txtRipartenze, intRipartenze.ToString());
            SetTextboxText(txtPartiteCreate, (0).ToString());
        }

        void torneo_generato(Torneo sender, EventArgs e)
        {
            //FormGriglia frmGrid = new FormGriglia() { Torneo = sender };
            //frmGrid.FillGriglia();

            //frmGrid.Show();
            ApriFormTorneo(sender);

        }

        delegate void ApriFormTorneoCallBack(Torneo torneo);
        private void ApriFormTorneo(Torneo torneo)
        {

            if (this.InvokeRequired)
            {
                ApriFormTorneoCallBack d = new ApriFormTorneoCallBack(ApriFormTorneo);
                this.Invoke(d, new object[] { torneo });
            }
            else
            {
                FormGriglia frmGrid = new FormGriglia() { Torneo = torneo };
                frmGrid.FillGriglia();

                frmGrid.Show();

            }
        }


        delegate void SetTextboxTextCallback(TextBox txt, string str);
        private void SetTextboxText(TextBox txt, string str)
        {
            if (txt.InvokeRequired)
            {
                SetTextboxTextCallback d = new SetTextboxTextCallback(SetTextboxText);
                this.Invoke(d, new object[] { txt, str});
            }
            else {
                txt.Text = str;
            }
        }


        private void btnStop_Click(object sender, EventArgs e)
        {
            try
            {
                trdGenera.Abort();
            }
            catch (Exception ex)
            {
            }
            finally
            {
            }
        }
    }
}
